/****************************************************************************
**
** @file ISerialCommand.h
** @brief 斯普瑞扫描器接口
** @author xiongpengchao@chinawebox.com
** @version 1.0.0
** @date 2019-10-30
**
****************************************************************************/

#ifndef I_SERIAL_COMMAND_H_
#define I_SERIAL_COMMAND_H_

#include <iostream>

namespace zl
{
namespace zlmodules
{

#define MIN_LEN             7               // 指令最小长度


#define SWITCH_POW_RESET_INFO_LEN           1                // 开关电源关闭 N秒后重启 执行结果返回 结果信息长度

#define CMD_SWITCH_POWER_RESET              0x01             // 开关电源关闭 N秒后重启



#define RET_ERROR_FLAG      0x81            // 下位机接收指令 校验错误返回 标记
#define RET_BUSY_FLAG       0x00            // 下位机接收指令 当前正在忙无法处理 标记
#define RET_VALID_FLAG      0x01            // 下位机接收指令 当前空闲立刻处理 标记

#define CMD_HEAD_FLAG       0xAA            // 通讯指令固定头 标记
#define MSG_HEAD_FLAG       0xBB            // 下位机主动回复测试结果指令固定头 标记
#define END_FLAG            0x55            // 通讯指令固定尾 标记


#define RESET_POW_SUCCESS               0x00            // 开关电源关闭 N秒后重启 执行成功
#define TURN_OFF_POW_FAILED             0x01            // 开关电源关闭 电源关闭失败
#define TURN_ON_POW_FAILED              0x02            // 开关电源关闭 N秒后重启失败

typedef enum
{
    Crt_Unknown = -1,       // 默认 未知
    Crt_Success = 0,        // 成功
    Crt_Check_fail,         // 下发指令校验失败
    Crt_Command_error,      // 回复指令号错误
    Crt_Length_error,       // 回复长度错误
    Crt_Bcc_error,          // 回复校验错误
    Crt_State_error,        // 回复状态错误
    Crt_Machine_busy,       // 回复下位机忙
    Crt_Index_error,        // 回复的指令序号错误

} CommandResultType;

typedef enum
{
    ST_Unknown = -1,
    ST_CN15 = 0x00000000,                // CN15开关
    ST_CN16 = 0x01000000,                // CN16开关
    ST_CN18 = 0x10000000,                // CN18开关
    ST_CN19 = 0x11000000,                // CN19开关
} SwitchType;

/// \brief SerialCommand事件回调接口
class ISerialCommandEventNotice
{
public:
    ISerialCommandEventNotice() = default;
    virtual ~ISerialCommandEventNotice() = default;

    /// \brief 指令回应结果回调事件
    virtual void CommandResult(const unsigned char& cmd, CommandResultType type, const unsigned char* data, size_t len) {}

    /// \brief 指令 回应信息 回调事件
    virtual void MsgData(const unsigned char& cmd, const unsigned char* data, size_t len) {}
};

/// \brief SerialCommand串口指令接口
class ISerialCommand
{
public:
    virtual ~ISerialCommand() = default;

    /// \brief 连接到设备
    virtual int32_t Connect(const std::string& port, int32_t baud) = 0;

    /// \brief 断开连接
    virtual void Disconnect() = 0;

    /// \brief 关闭开关电源 n秒后重启
    virtual int32_t ResetSwitchPowerCommand(zl::zlmodules::SwitchType switch_type, int32_t seconds) = 0;

};

} // namespace zlmodules
} // namespace zl

#endif // I_SERIAL_COMMAND_H_
